﻿using System;
using System.Windows.Forms;
using ProyectoActivos.Const;
using ProyectoActivos.Daos;
using EntitiesAndMappings.Entities;
using ProyectoActivos.Validate;

namespace ProyectoActivos.Forms.Mantenimiento
{
    public partial class FrmCrearEntidadGenerica<T> : Form, IValidateForm where T : EntidadGenerica, new()
    {
        private EntidadGenericaDAO<T> DAO;
        private Boolean _valido;
        private EntidadGenerica entidadGenerica;
        private String cadenaDescriptivaEntidad;

        public FrmCrearEntidadGenerica(EntidadGenerica entidadGenerica, EntidadGenericaDAO<T> DAO)
        {
            InitializeComponent();
            _valido = true;


            this.entidadGenerica = entidadGenerica;

            if (this.entidadGenerica.Codigo != null)
            {
               
                txtCodigo.DataBindings.Add("Text", this.entidadGenerica, "Codigo");
                txtDescripcion.DataBindings.Add("Text", this.entidadGenerica, "Descripcion");
            } 

            
            this.DAO = DAO;
        }

        public String CadenaDescriptivaEntidad
        {
            get { return cadenaDescriptivaEntidad; }
            set
            {
                cadenaDescriptivaEntidad = value;
                this.Text = String.Format(this.Text, cadenaDescriptivaEntidad);
            }
        }

        private void btnAceptar_Click(object sender, EventArgs e)
        {
            _valido = true;
            errorProvider.Clear();
            FormsAssert.AssertTextBoxNotEmptyAndSize(txtCodigo, 8, errorProvider, this);
            FormsAssert.AssertTextBoxNotEmptyAndSize(txtDescripcion, 75, errorProvider, this);


            if (this.entidadGenerica.Codigo != null) //modificación
            {
                ActionExecutor.Execute(this, delegate
                {
                    DAO.Update(this.entidadGenerica as T);
                    Close();
                });
            }
            else //creación
            {

                T entidadAntigua = DAO.FindByCodigo(txtCodigo.Text);
                if (entidadAntigua != null) 
                {
                    MessageBox.Show("El código ingresado ya existe, el estado es: " + (entidadAntigua.Estado.CompareTo("A") == 0? "Activo" : "Inactivo"));
                    return; 
                } 

                this.entidadGenerica.Codigo = txtCodigo.Text;
                this.entidadGenerica.Descripcion = txtDescripcion.Text;
                this.entidadGenerica.Estado = Estado.Activo;

                ActionExecutor.Execute(this, delegate
                {
                    DAO.Insert(this.entidadGenerica as T);
                    Close();
                });
            }
            

            //entidadGenerica.Codigo = txtCodigo.Text;
            //entidadGenerica.Descripcion = txtDescripcion.Text;
            //entidadGenerica.Estado = Estado.Activo;

            //ActionExecutor.Execute(this, delegate
            //{
            //    DAO.Insert(entidadGenerica as T);
            //    Close();
            //});



            //  EntidadGenerica entidadGenerica = new T() as EntidadGenerica;


        }

       

        protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
        {
            e.Cancel = true;
            Hide();
        }

        public void DeshabilitarEdicionDeCodigo() 
        {
            this.txtCodigo.Enabled = false;
        }


        public void Invalid()
        {
            _valido = false;
        }

        public bool IsValid()
        {
            return _valido;
        }
    }
}